import numpy as np
import matplotlib.pyplot as plt

N = 100000 # Nombre de simulations pour la methode de Monte-Carlo

# Definition des grandeurs mesurees
m = 0.7911 # Masse de solide du thiosulfate de sodium (en g)
EMT_m = 0.0001 # Erreur maximale toleree sur la masse de solide (en g)
V = 100e-3 # Volume de la fiole (en L)
EMT_V = 0.1e-3 # Erreur maximale toleree sur le volume de la fiole (en L)
M = 158.11 # Masse molaire du thiosulfate de sodium (en g/mol)

# Methode de Monte-Carlo
m_rd = m + np.random.uniform(-EMT_m, EMT_m, N) + np.random.uniform(-EMT_m, EMT_m, N) 
V_rd = np.random.triangular(V-EMT_V, V, V+EMT_V, N)   
C = m_rd/(M*V_rd) 
C_calc = m/(M*V) 
s_C = np.std(C)

# Affichage du resultat
print('C =',format(C_calc,'.4E'),'\u00B1',format(2*s_C,'.1E'),'mol/L a 95 % de confiance')

# Histogramme des differentes valeurs de C
plt.figure("Tirage")
plt.hist(C, bins = 200, color = 'grey', alpha = 0.7)
plt.xlabel("C (en mol/L)", fontsize = 20)
plt.ylabel("Occurrences", fontsize = 20)
plt.xticks(fontsize = 20)
plt.yticks(fontsize = 20)
plt.show()

# Diagramme en barres de la contribution relative des incertitudes
C_m = m_rd/(M*V) # Creation d'un tableau de concentration avec uniquement m qui varie
C_V = m/(M*V_rd) # Creation d'un tableau de concentration avec uniquement V qui varie
simul = [C_m, C_V]

prop_tot = np.var(C_m) + np.var(C_V) # Variance totale
valeur = []
for i in range(len(simul)):
    valeur.append(np.var(simul[i])/prop_tot*100) # Calcul de la contribution relative a la variance

plt.figure("Proportion")
plt.bar([1,2], height = valeur, tick_label = ('$m$', '$V_{fiole}$'), color = 'grey', alpha = 0.7)
plt.xlabel("Grandeur mesuree", fontsize = 20)
plt.ylabel("Contribution relative de chaque incertitude (%)", fontsize = 20)
for i in range(len(valeur)):
        plt.text(i+1, valeur[i]+1, round(valeur[i],1), ha = 'center', fontsize = 20)
plt.xticks(fontsize = 20)
plt.yticks(fontsize = 20)
plt.show()